iT邦幫忙

2025 iThome 鐵人賽

DAY 23
1

雖然我們已經讓測試可以成功地在 Github / Gitlab 上運行,但是在不同專案、不同環境,或是不同機器上,測試結果可能大相逕庭,如何確保測試環境的一致性可控性以及可重現性,就是非常關鍵的問題,因此,我們需要利用 Docker 打造一個輕量、隔離的測試基地

為什麼要用 docker 打造測試環境?

  1. 環境一致性:
    Docker 封裝整個環境,從 Node.js、瀏覽器、相關套件到系統依賴,讓每次執行測試時都是完全相同的環境
  2. 方便管理多個專案 / 多個版本:
    運用 Docker 可以快速切換不同專案 / 版本,以達到多環境需求。
  3. 完全隔離:
    Docker 容器 (container) 可以完全隔離環境,測試完畢可以直接刪除容器,不會互相干擾。
  4. 可重現測試結果:
    降低不同平台的差異問題,確保測試結果可重現。

對於 Docker 的概念想更深入研究的玩家們,推薦參考小賴的《Docker 實戰 6堂課:56個實驗動手做,掌握 Linux 容器核心技術》,這邊就不多作探討。

Playwright 官方提供的 Docker Image

前一篇我們在建立 GitLab CI/CD 流程時有提到 Playwright 官方的 Docker image,在 Microsoft Artifact Registry 頁面可以看到每一個版本都會發布三個 tags 的 Docker image,主要差異在於 Ubuntu 版本不同,由後綴就能直接對應到代號相同的 Ubuntu 版本。

例如目前最新的 v1.55.1 版本,會釋出:

  • v1.55.1 - 建立在 Ubuntu 24.04 LTS (Noble Numbat) 作業系統之上
  • v1.55.1-noble - 建立在 Ubuntu 24.04 LTS (Noble Numbat) 作業系統之上
  • v1.55.1-jammy - 建立在 Ubuntu 22.04 LTS (Jammy Jellyfish) 作業系統之上

準備 Docker Desktop

  1. 如作業環境為 Windows / MacOS,需先安裝好 Docker Desktop
  2. 在使用 Docker 前必須開啟 Docker Desktop,否則無法執行 Docker

準備好之後,我們就來打造 Docker 環境吧!

啟用 Docker 操作步驟

  1. 開啟 CLI,移動到專案資料夾
  2. 輸入指令
    docker run --rm -it --ipc=host -v "<本機路徑>:<容器路徑>" mcr.microsoft.com/playwright:v1.55.1-noble bash
    
    如果沒有本地沒有對應的 image ,會自動 pull 下來:
    https://ithelp.ithome.com.tw/upload/images/20251002/20168913CO4lPs5sdT.png
    • docker run Docker 指令,啟動一個新的容器
    • --rm 關閉容器後自動刪除
    • -it 進入容器並操作命令列
    • -v <本機路徑>:<容器路徑>" 掛載專案目錄到容器內,請自行將本機路徑替換成自己的專案目錄路徑,容器路徑可設定為你喜歡的路徑或資料夾名稱
    • --ipc=host 允許容器與主機共享 IPC namespace (稍微降低隔離性,但可避免高負載情況下遇到 shared memory 限制導致測試不穩定)
    • mcr.microsoft.com/playwright:v1.55.0-noble 指定的 Docker image
    • /bin/bash 進入 bash shell
  3. 出現 root@<container ID>:/# 表示順利進入容器
  4. 輸入指令 cd /<容器路徑> 進入剛剛掛載好專案的容器路徑裡
  5. 輸入指令 npm ci 使用 package-lock.json 安全且可重現地安裝 node 套件
  6. 輸入指令 npx playwright install --with-deps 安裝 Playwright 的瀏覽器與系統相依套件
  7. 輸入指令 npx playwright test 就能看到開始執行測試,執行完畢會顯示測試結果:
    https://ithelp.ithome.com.tw/upload/images/20251002/20168913pUMMRgTeRP.png

踩到的坑:容器內的 npm 與本機不同

在執行 npm ci 這個步驟時,可能會出現以下錯誤訊息:
https://ithelp.ithome.com.tw/upload/images/20251002/201689131ifTfacm1z.png

這個問題困擾了我好一陣子,我的本機 npm 版本已經更新了,但每次執行都還是會出現這個問題。
後來才終於搞懂,這是因為我們執行的 npm 不是本機的版本,而是 container 裡 Playwright 官方的 image,所以我們使用的是 image 裡內建的 npm 版本,因此需要先在容器內手動升級 npm ,才能順利繼續往下執行。
其實這正好體現了 Docker container 的環境隔離特性,本機環境的設定與套件不會汙染 container,確保每次啟動 container 時都能擁有一個乾淨且可重現的執行環境。


到這裡,我們已經學會如何透過 Docker 打造一個輕量的測試環境,接下來,要更進一步運用 Dockerfile 來建立測試環境,提高環境一致性可重現性


上一篇
Day 22:自動化基地(二)|在 GitLab 上建立 CI/CD 流程
下一篇
Day 24:打造移動基地(二)|用 Dockerfile 建立測試環境
系列文
Playwright 玩家攻略:從新手村到魔王關24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言